// #include <iostream>
// #include <vector>
// #include <algorithm>

// class ListNode
// {
// public:
//     int val;
//     ListNode *next;
//     ListNode(int value)
//     {
//         val = value;
//         next = nullptr;
//     }
// };

// std::vector<ListNode *> sortlist(std::vector<ListNode *> &lists)
// {
//     sort(lists.begin(), lists.end(), [](ListNode *l1, ListNode *l2)
//          {
//         if(l1 == nullptr) return true;
//         else if(l2 == nullptr) return false;
//         while(l1 && l2)
//         {
//             if(l1->val < l2->val) return true;
//             else if(l1->val > l2->val) return false;
//             l1 = l1->next;
//             l2 = l2->next;
//         }

//         return l1 == nullptr; });
//     return lists;
// }

// int main()
// {
//     ListNode *n1 = new ListNode(1);
//     ListNode *n2 = new ListNode(2);
//     ListNode *n3 = new ListNode(2);
//     ListNode *n4 = new ListNode(1);
//     ListNode *n5 = new ListNode(3);
//     n1->next = n2;
//     n3->next = n4;
//     // std::vector<ListNode *> lists({nullptr, n1, n3, n5});
//     // std::vector<ListNode *> lists({nullptr, nullptr, nullptr, nullptr});
//     // std::vector<ListNode *> lists({});
//     std::vector<ListNode *> lists({nullptr, n1, n3, n5});
//     sortlist(lists);
//     for (auto list : lists)
//     {
//         while (list)
//         {
//             std::cout << list->val << " ";
//             list = list->next;
//         }
//         std::cout << std::endl;
//     }
//     return 0;
// }

// #include <iostream>
// #include <ucontext.h>
// #include <unistd.h>

// int main()
// {
//     ucontext_t context;

//     getcontext(&context);
//     puts("Hello world");
//     sleep(1);
//     setcontext(&context);
//     return 0;
// }

// #include <ucontext.h>
// #include <stdio.h>

// void func1(void *arg)
// {
//     puts("1");
//     puts("11");
//     puts("111");
//     puts("1111");
// }
// void context_test()
// {
//     char stack[1024 * 128];
//     ucontext_t child, main;

//     getcontext(&child);                     // 获取当前上下文
//     child.uc_stack.ss_sp = stack;           // 指定栈空间
//     child.uc_stack.ss_size = sizeof(stack); // 指定栈空间大小
//     child.uc_stack.ss_flags = 0;
//     child.uc_link = &main; // 设置后继上下文

//     makecontext(&child, (void (*)(void))func1, 0); // 修改上下文指向func1函数

//     swapcontext(&main, &child); // 切换到child上下文，保存当前上下文到main
//     puts("main");               // 如果设置了后继上下文，func1函数指向完后会返回此处
// }

// int main()
// {
//     context_test();
//     return 0;
// }

#include <iostream>
#include <vector>
#include <map>
#include <tuple>
#include <functional>
#include <algorithm>

using namespace std;

// int main()
// {
//     int N, blk;
//     cin >> N >> blk;
//     vector<int> nums(N);
//     for (int i = 0; i < N; ++i)
//     {
//         cin >> nums[i];
//     }

//     auto cmp = [](const std::vector<int> &v1, const std::vector<int> &v2)
//     {
//         return v1 < v2;
//     };
//     map<vector<int>, pair<int, int>, decltype(cmp)> res; // 用于存储数据块及其首次出现的下标和出现次数

//     // std::function<bool(const std::vector<int> &, const std::vector<int> &)> cmp = [](const std::vector<int> &v1, const std::vector<int> &v2)
//     // {
//     //     return v1 < v2;
//     // };

//     // std::map<std::vector<int>, std::pair<int, int>, decltype(cmp)> res(cmp);
//     for (int i = 0; i < N; i += blk)
//     {
//         vector<int> cur_blk(nums.begin() + i, nums.begin() + min(i + blk, N));
//         if (res.find(cur_blk) == res.end())
//         {
//             res[cur_blk] = {i, 1};
//         }
//         else
//         {
//             res[cur_blk].second += 1;
//         }
//     }

//     vector<pair<vector<int>, pair<int, int>>> sorted_res(res.begin(), res.end());
//     std::sort(sorted_res.begin(), sorted_res.end(), [](const auto &a, const auto &b)
//               { return a.second.first < b.second.first; });

//     vector<int> ans;
//     for (const auto &kv : sorted_res)
//     {
//         ans.insert(ans.end(), kv.first.begin(), kv.first.end());
//         ans.push_back(kv.second.second);
//     }

//     for (size_t i = 0; i < ans.size(); ++i)
//     {
//         cout << ans[i];
//         if (i != ans.size() - 1)
//             cout << " ";
//     }
//     cout << endl;

//     return 0;
// }

int main()
{
    auto cmp = [](const std::vector<int> &v1, const std::vector<int> &v2)
    {
        return v1.size() < v2.size();
    };
    map<vector<int>, pair<int, int>, decltype(cmp)> res;
    return 0;
}